home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 5
/
Aminet 5 - March 1995.iso
/
Aminet
/
misc
/
amag
/
AM9401_2.lha
/
Amiga0194b
/
Blitz-Basic
/
listing2.asc
< prev
next >
Wrap
Text File
|
1994-02-28
|
4KB
|
148 lines
;
; IsoBlaster V0.1 by Simon Armstrong
;
;
; Typdefinitionen und Felder
;
NEWTYPE .object ;wie IsoRender.bb plus extra Felder
depth.q:id ;Tiefe und Shape, wobei ID 0=me 1=mozzy
x:y:z ;3D Koordinaten der Shape
vx:vy ;Geschwindigkeit in x and y-Richtung
rot:rot2:rotv ;Variablen fuer die Rotation
sx:sy ;Screenposition nach der Iso-Projection
End NEWTYPE
Dim List bob.object(50)
DEFTYPE .object *me
Dim qsin(255),qcos(255) ;Feld mit Werten fuer sin/cos belegen sodass sie nicht
For r=0 To 255 ;waehrend des Spiels berechnet werden muessen
qsin(r)=Sin(Pi*r/128):qcos(r)=Cos(Pi*r/128)
Next
Dim map.w(20,20) ;bisschen kleiner als Verlies (z.Zt.)
;
; Alle Graphiken von der Platte laden
;
LoadShapes 0,"blocks.shapes" ;Fliesen fuer Boden
LoadShapes 4,"balls.shapes" ;Kugeln fuer fx etc.
LoadPalette 0,"balls.iff" ;Palette fuer Vordergrund Playfield
LoadPalette 0,"blocks.iff",8 ;Palette fuer Hintergrund
LoadShapes 16,"isoshapes" ;Shapes, von IsoRender.bb berechnet
BitMap 0,320+64,256+80,3 ;Vordergrund A
BitMap 1,320+64,256+80,3 ;Vordergrund B
BitMap 2,640,512,3 ;Grosser Hintergrund zum Scrollen
Queue 0,32:Queue 1,32 ;2 Queues fuer doppelt gepuffertes Blitting
Macro p 320+(`1-`2)ASL 4,128+(`1+`2-`3)ASL3:End Macro ;hinten
Macro f 320+32-sx+(`1-`2)ASL4,128+32-sy+(`1+`2-`3)ASL3:End Macro ;vorne
;
; Blitz Mode Display erzeugen, hier Dualplayfield mit
; doppelt gepuffertem Vordergrund!
;
BLITZ
Slice 0,44,320,256,$fffa,6,8,32,320+64,640
Use Palette 0
Gosub setupmap ;2D-Feld mit einigen Bloecken belegen
Gosub drawmap ;Karte in den Hintergrund zeichnen
Gosub initgame ;Objekte initialisieren
; nun endlich die Arbeitsschleife, wie bei jedem Spiel
While Joyb(0)=0
VWait:ShowF db,32,40,sx:ShowB 2,sx,sy,32 ;Bitmaps im Display positionieren
db=1-db:Use BitMap db ;Bitmap tauschen fuer doppelte Pufferung
Gosub moveme ;mich bewegen
Gosub movethem ;und die anderen auch
UnQueue db:Gosub drawbobs ;Objekte in neue Position zeichnen
; MOVE#-1,$dff180 ;Frameaufbau beachten!
Wend
End
;
; und dies hier bringt alles richtig zum Laufen
;
.moveme:
USEPATH *me ;Zeiger auf Listenobjekt
\rot=QWrap(\rot-Joyx(1)/2,0,16) ;je nach Joystick drehen
If Joyb(1)=1 ;bei Feuer
\vx+qsin(\rot ASL 4) ASR 6 ;Schub in die Richtung,
\vy+qcos(\rot ASL 4) ASR 6 ;in die ich zeige (my \rot)
EndIf
\vx-\vx ASR 5 ;einen Teil des Betrags der
\vy-\vy ASR 5 ;Geschwindigkeit abziehen und
\x=QLimit(\x+\vx,0,19) ;Geschwindigkeit zu der Position addieren
\y=QLimit(\y+\vy,0,19)
\sx=!p{\x,\y,\z} ;Bildschirmkoordinaten berechnen
sx=QLimit(\sx-160,0,320) ;Werte zum Scrollen berechnen sodass
sy=QLimit(\sy-128,0,256) ;ich moeglichst in die Mitte des Displays komme
\sx-sx+32:\sy-sy+32
\depth=\x+\y ;die Tiefe nicht vergessen
If map(\x,\y)=1 ;und den Block einfaerben wenn ich auf einem bin
Use BitMap 2:x=Int(\x):y=Int(\y):Blit 2,!p{x,y,0}:Use BitMap db
EndIf
Return
.movethem:
USEPATH bob() ;einfache Schleife, die alle Shapes
ResetList bob() ;mit \id=2 in Kreisen
While NextItem(bob()) ;herumfliegen laesst...
If \id=2
\rot=QWrap(\rot+\rotv,0,16)
\rot2=QWrap(\rot2+1,0,16)
\x+qsin(\rot ASL 4) ASR 4:\y+qcos(\rot ASL 4) ASR 4
\sx=!f{\x,\y,\z}
\depth=\x+\y
EndIf
Wend
.drawbobs:
SortList bob() ;rueckwaerts sortieren
ResetList bob() ;Schleife ueber alle Shapes: zeichnen und wenn
USEPATH bob() ;\id=2 auch den Propeller zeichnen
While NextItem(bob())
If RectsHit(\sx,\sy,1,1,16,40,320+31,256+40)
QBlit db,\id*16+\rot,\sx,\sy
If \id=2 Then QBlit db,\id*16+16+\rot2,\sx,\sy
EndIf
Wend
Return
.initgame:
ClearList bob()
AddItem bob():*me.object=bob()
*me\id=1,.5,.5,0
For i=0 To 2
If AddItem(bob())
bob()\id=2,Rnd(19),Rnd(19):\rotv=(Rnd(1)-.5)ASR 2
EndIf
Next
Return
.setupmap:
For x=0 To 19:For y=0 To 19:map(x,y)=1:Next:Next
For x=9 To 11:For y=9 To 11:map(x,y)=-1:Next:Next
Return
.drawmap:
Use BitMap 2
For x=0 To 19
For y=0 To 19
If map(x,y)>-1 Then Blit map(x,y),!p{x,y,0}
Next
Next
Return